package com.example;

// 测试“字段与静态方法”陷阱（只有普通的实例方法（非private、非final）调用才是多态的，访问字段、调用静态方法不是多态的）
public class TestFieldsAndStaticMethodTraps {

    public static class Parent{
        public static String staticString = "staticString of Parent";
        public String variableString = "variableString of Parent";
        public static void staticFunction(){
            System.out.println("Parent.staticFunction() is running.");
        }
    }

    // Son实际上包含了两个staticString，一个来自父类定义的，一个是它自己定义的（它们实际上被分配到了不同的存储空间）
    public static class Son extends Parent{
        public static String staticString = "staticString of Son";
        public String variableString = "variableString of Son";
        public static void staticFunction(){
            System.out.println("Son.staticFunction() is running.");
        }

        public static void useParentsStaticString(){
            System.out.println(Parent.staticString); // staticString of Parent
        }

        public void useParentVariableString(){
            System.out.println(super.variableString); // variableString of Parent
        }
    }

    public static void main(String[] args) {
        Parent o = new Son();
        {
            // 首先看静态字段
            System.out.println("o.staticString：" + o.staticString); // o.staticString：staticString of Parent

            // 接着看实例字段
            System.out.println("o.variableString：" + o.variableString); // o.variableString：variableString of Parent

            // 接着看静态方法
            o.staticFunction(); // Parent.staticFunction() is running.
        }

        Son son = (Son) o;
        {
            // 首先看静态字段
            System.out.println("son.staticString：" + son.staticString); // son.staticString：staticString of Son

            // 接着看实例字段
            System.out.println("son.variableString：" + son.variableString); // son.variableString：variableString of Son

            // 接着看静态方法
            son.staticFunction(); // Son.staticFunction() is running.

            son.useParentsStaticString(); // 输出：staticString of Parent

            son.useParentVariableString(); // 输出：variableString of Parent
        }

        // 得出结论： 变量看等号左边的类型，静态方法看左边，实例方法看右边
    }
}
